我知道PS5已經退燒了,但要不是因為想搶PS5我根本不會碰Python (一種恩人的概念)
所以今天還是拿PS5舉例喔~
Selenium的基本用法
大家只要想Selenium就是模擬我們用電腦的點擊、打字、導向網頁等行為
driver.get("https://m.momoshop.com.tw/mymomo/login.momo")
要買東西,第一步就是要先到購物網站登入。
driver.get() 裡面放的是你要連的網站,這邊打開是momo購物網的登入頁面喔~
driver.find_element_by_id('memId').send_keys('你的帳號')
driver.find_element_by_id('passwd').send_keys('你的密碼')
再來就是要輸入你的帳號密碼,send_keys() 裡面放的是你要輸入的字,
那要怎麼知道要在哪一個框框輸入帳號呢? 首先要在網站頁面按 F12,
接下來再按圖片1號處的選取箭頭,點擊圖片2號處的帳號框框,就可以得到帳號框的屬性囉(圖片3號處)!
知道帳號框框的id是memId後,就可以用find_element_by_id() 定位元素了~
其實也不一定要用id定位,只是這個方法最不會錯,其他定位方式可以看Selenium官方文件喔~
driver.find_element_by_class_name('login').click()
輸入完帳號密碼要點擊下方的登入,我這邊用的定位方式是class name,
WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located((By.ID, 'buy_yes')))
進入PS5購買頁面會看到可訂購時通知我的按鍵 (不可購買)
所以我們要用顯性等待方式,每0.5秒刷新一次頁面,直到偵測到直接購買按鈕為止
那要怎麼得到直接購買按鈕的id呢? 去別的商品頁面看就可以囉~
完整程式碼(不含結帳部分)
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
options = webdriver.ChromeOptions()
prefs = {
'profile.default_content_setting_values':
{
'notifications': 2
}
}
options.add_experimental_option('prefs', prefs)
options.add_argument("disable-infobars")
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.get("https://m.momoshop.com.tw/mymomo/login.momo") # 到登入頁面
driver.find_element_by_id('memId').send_keys('帳號') # 輸入帳號
driver.find_element_by_id('passwd').send_keys('密碼') # 輸入密碼
driver.find_element_by_class_name('login').click()
driver.get("https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=8267514&str_category_code=2900100474")
#driver.get("https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=8820259&mdiv=shopCart")
while 1:
try:
buy = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located((By.ID, 'buy_yes'))) # 顯性等待
buy.click() # 偵測到可以購買按鈕就點擊按鈕
print ('可以購買!')
break # 後面結帳部分就不寫囉
except:
print("還不能購買! 重新整理!")
driver.refresh() # 重整頁面
成果發表會從缺
因為PS5一直都沒補貨,加上我也沒錢買,所以這次沒有成果發表會喔哈哈
寫這種搶票最大的困難點在於你點下購買他只是進入購物車,還有後續結帳部分
除非你以前有結帳過,有寫完後續處理
不然在完成結帳前,你搶到的名額還是會被結帳的人搶走
因為我之前有買過東西,所以只要輸入卡好按送出就買好了XD
真的是實用的教學 XDDD
雖然好像沒很相關,
但如果想在 PChome 搜尋商品,也歡迎參考我這篇~
[Python爬蟲實例] PChome 線上購物 (上篇)
寫的超詳細!! 只好拍手五次ㄌ
感謝教學!!
剛剛試了一下,網頁是不能訂購的狀態,
但程式執行後,卻回應說「可以購買」,
是我弄錯了什麼嗎?
喔喔喔!!!!太感謝了!
我之前測試的時候拿可以購買的商品做測試,忘記改回來><
buy = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located((By.ID, 'buy_yes'))) # 改成BY.ID,'buy_yes'
這行改掉就沒有問題了喔~~
謝謝您的提醒!!!
謝謝您的回覆!!
但這次您的帳號,密碼直接寫在code中了喔!!!
........我要崩潰了
好險你有跟我說
哈哈哈,謝謝您了。
有空再好好拜讀您的系列文,真的太讚了。
看來我還沒從打完疫苗的副作用康復